﻿using DotNetStar.TheKing.Infrastructure;
using System;
using System.Collections.Generic;
using System.Text;

namespace DotNetStar.TheKing.Services
{
    /// <summary>
    /// 表示帖子是否要包含私密帖子
    /// </summary>
    public interface IContentQueryIncludeSecret
    {
        /// <summary>
        /// 表示是否包含私密位置。
        /// 
        /// <para>
        /// 一般需要和 <see cref="IContentAuthorQuery"/> 一起使用
        /// </para>
        /// </summary>
        bool IncludeSecret { get; }
    }

    /// <summary>
    /// 提供基本的内容查询功能。
    /// </summary>
    public interface IContentQuery:IContentAuthorQuery
    {
        /// <summary>
        /// 获取要查询的频道。
        /// </summary>
        Channels? Channel { get; }
        /// <summary>
        /// 获取要查询的分类。
        /// </summary>
        int? CategoryId{get;}
        /// <summary>
        /// 获取要查询的状态数组。
        /// </summary>
        ContentStatus[] IncludeStatus { get; }
    }

    /// <summary>
    /// 提供帖子可分页的查询。
    /// </summary>
    public interface IContentAuthorQuery
    {
        /// <summary>
        /// 表示帖子作者的用户Id。
        /// </summary>
        long? AuthorUserId { get; }
    }

    /// <summary>
    /// 默认帖子查询对象
    /// </summary>
    public class ContentQuery : IContentQuery,IKeywordQuery, IContentQueryIncludeSecret
    {
        /// <summary>
        /// 获取或设置要筛选的频道。不设置表示不进行筛选。
        /// </summary>
        public Channels? Channel { get; set; }
        /// <summary>
        /// 获取或设置要筛选的分类。不设置表示不进行筛选。
        /// </summary>
        public int? CategoryId { get; set; }
        /// <summary>
        /// 获取或设置要包含的状态。默认仅包含 <see cref="ContentStatus.Normal"/> 的状态。
        /// </summary>
        public ContentStatus[] IncludeStatus { get; set; } = new[] { ContentStatus.Normal };

        /// <summary>
        /// 获取设置要查询的关键字。
        /// </summary>
        public string Keyword { get; set; } = string.Empty;

        /// <summary>
        /// 获取或设置筛选的帖子作者Id。不设置表示不筛选。
        /// </summary>
        public long? AuthorUserId { get; set; }
        /// <summary>
        /// 获取或设置一个布尔值，表示是否包含私密帖子。
        /// </summary>
        public bool IncludeSecret { get; set; }

        /// <summary>
        /// 表示使用默认的值。
        /// </summary>
        public static readonly ContentQuery Default = new ContentQuery();
    }

    /// <summary>
    /// 默认的内容分页查询实例。
    /// </summary>
    public class ContentPageQuery : ContentQuery, IContentAuthorQuery
    {
        /// <summary>
        /// 使用指定的页码初始化 <see cref="ContentPageQuery"/> 类的新实例。
        /// </summary>
        /// <param name="page">当前页码。</param>
        public ContentPageQuery(int page) => this.Page = page;
        /// <summary>
        /// 获取当前页码。
        /// </summary>
        public int Page { get; }
        /// <summary>
        /// 获取或设置每一页呈现的数据量，默认10。
        /// </summary>
        public int Size { get; set; } = 10;

    }
}
